﻿import type { App } from 'vue'
import { createWebHistory, createRouter } from 'vue-router'
import { routerWhiteList, parseURL, setPageTitle, initRouter } from '@/utils/routerHelper'
import { openLink } from '@/utils'
import { useUserStoreWithOut } from '@/store/modules/user'
import { useDictStoreWithOut } from '@/store/modules/dict'
import { useTagCacheStoreWithOut } from '@/store/modules/tag'
import { useKeepAliveStoreWithOut } from '@/store/modules/keepAlive'
import { useNProgress } from '@/hooks/web/useNProgress'
import { getAccessToken } from '@/utils/auth'
import remainingRouter from '@/router/remaining'
import { useInit } from '@/hooks/web/useInit'
const { VITE_PUBLIC_PATH } = import.meta.env

const { start, done } = useNProgress()

// 创建路由实例
export var router = createRouter({
  history: createWebHistory(VITE_PUBLIC_PATH),
  routes: remainingRouter
})

router.beforeEach(async (to, from, next) => {
  const tagCacheStore = useTagCacheStoreWithOut()
  const keepAliveStore = useKeepAliveStoreWithOut()
  // 进度条开启
  start()
  // 缓存相关操作
  keepAliveStore.routerBeforeOperate(to, from)
  // 第一步：判断 token 是否存在，验证是否已登录
  if (getAccessToken()) {
    // 第二步：判断去哪儿
    // 去登录页面，已登录状态默认跳转回首页
    if (to.name === 'Login') {
      next({ path: '/' })
    } else if (to?.redirectedFrom?.fullPath) {
      // 去重定向页面
      if (to?.redirectedFrom?.fullPath.includes('://')) {
        // 重定向到外链页面
        done()
        openLink(to?.redirectedFrom?.fullPath)
      } else {
        tagCacheStore.dynamicRouteTag(to)
        next()
      }
    } else {
      // 去框架内部其它页面
      const dictStore = useDictStoreWithOut()
      const userStore = useUserStoreWithOut()
      // 第三步：判断来自哪儿
      // 来自登录页、或者来自的页面不存在（浏览器刷新操作）
      if (from?.name === 'Login' || !from?.name) {
        if (!from?.name) {
          const { appInit } = useInit()
          appInit()
        }
        // 获取所有字典
        await dictStore.setDictMap()
        // 获取用户信息（包括权限菜单数据，权限操作数据）
        await userStore.setUserInfoAction()
        // 初始化动态路由，将动态路由实例化，并
        await initRouter()
        const redirectPath = from.query.redirect || to.path
        // 修复跳转时不带参数的问题
        const redirect = decodeURIComponent(redirectPath as string)
        const { paramsObject: query } = parseURL(redirect)
        const nextData = to.path === redirect ? { ...to, replace: true } : { path: redirect, query }
        console.log('添加标签1', to)
        tagCacheStore.dynamicRouteTag(to)
        next(nextData)
      } else {
        console.log('添加标签2', to)
        tagCacheStore.dynamicRouteTag(to)
        next()
      }
    }
  } else {
    // 未登录
    // 当前访问页面包含在路由白名单中，可直接跳转
    if (routerWhiteList.login.includes(to.name as string)) {
      next()
    } else {
      // 当前访问页面需要登录才能访问，需先跳转到登陆页，并将当前访问路由通过链接保存，在登陆后，获取该路由进行跳转
      next(`/Login?redirect=${to.fullPath}`)
    }
  }
})

router.afterEach(to => {
  // 设置页面标题
  setPageTitle(to?.meta)
  // 进度条结束
  done()
})

export const setupRouter = (app: App<Element>) => {
  app.use(router)
}

export default router
